<?php

namespace app\common\util\builder;

use app\common\model\Coupon;
use app\common\util\WhereBuilder;

/**
* 产品where构建器
*/
class CouponWhereBuilder extends WhereBuilder
{
    /**
     * 使用用户可领取优惠券限制条件
     * - 只显示满减券和折扣券
     * - 只显示能在产品页领取的
     * - 只显示在领取时间内的
     * - 有效优惠券
     * @param string $c 优惠券查询别名
     */
    public function useMemberRestriction($productId = null, $require_product_type = null, $member = null, $c = 'c', $cpr = 'cpr')
    {
        $now = getNow();
        return $this
            // 折扣类型 固定金额优惠 折扣优惠
            ->in("$c.discount_type", [Coupon::DISCOUNT_TYPE_CONST, Coupon::DISCOUNT_TYPE_PERCENT])
            // 领取类型 产品页领取, 其中当用户已经大量时，不做筛选
            ->in("$c.user_receive_type", $member ? null :  [Coupon::USER_RECEIVE_TYPE_PROD])
            // 领取开始时间在当前时间之前
            ->where("$c.user_receive_start_time", '<=' , $now)
            // 永久可以领券（为null时） 或 在领券结束时间前
            ->whereRaw("`$c`.`user_receive_end_time` is null OR `$c`.`user_receive_end_time` >= '$now'")
            // 有效期类型不为固定结束时间 且 固定结束时间在当前时间之后
            ->whereRaw("`$c`.`validity_type` <> 'LIFE_TIME' OR `$c`.`validity_life_time` > '{$now}'")
            // 有效的优惠券
            ->eq("$c.valid", 1)
            // 限制所有产品可用 或 部分产品可用
            ->whereRaw("`$cpr`.`id` is null or `cpr`.`product_id` = {$productId}", !is_null($productId))
            // 优惠券类型为通用或传入的产品类型
            ->whereRaw("`$c`.require_product_type in (0, $require_product_type)", !is_null($require_product_type));
    }

    /**
     * 限制为用户所有不过期的优惠券
     *
     * @param mixed $member_id 用户id
     * @param string $cu CouponUser的alias
     * 
     * @return static
     */
    public function useMemberAllCouponUserRestriction($member_id, $cu = 'cu')
    {
        $now = getNow();
        return $this->eq('cu.member_id', $member_id)
            ->whereRaw("`$cu`.`expire_time` is null or `$cu`.`expire_time` > '$now'");
    }
}